Many modern computing systems are capable of executing multiple process threads concurrently. Applications instrumented with multiple threads of execution are able to utilize the advantages of such systems. However, the threads in multi-threaded applications may frequently perform operations targeting the same hardware resources. Competition for access to these resources may result in inefficient utilization of those resources.